home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 21
/
AACD 21.iso
/
AACD
/
Programming
/
amigatalk
/
user
/
Quaternion.st
< prev
Wrap
Text File
|
2000-05-08
|
5KB
|
195 lines
" ------------------------------------------------------------- "
" Quaternion.st - Implementation of Quaternions class for "
" AmigaTalk. "
" ------------------------------------------------------------- "
Class Quaternion :Magnitude
! s i j k !
[
new
s <- Float new: 0.0.
i <- Float new: 0.0.
j <- Float new: 0.0.
k <- Float new: 0.0
|
tensor
^s
|
ipart
^i
|
jpart
^j
|
kpart
^k
|
tensor: newReal
s <- newReal
|
ipart: newI
i <- newI
|
jpart: newJ
j <- newJ
|
kpart: newK
k <- newK
|
versor: ni p2: nj p3: nk
i <- ni.
j <- nj.
k <- nk
|
coerce: aNumber ! newQuaternion !
newQuaternion <- Quaternion new.
newQuaternion tensor: aNumber.
newQuaternion ipart: 0.0.
newQuaternion jpart: 0.0.
newQuaternion kpart: 0.0.
^ newQuaternion
|
conjugate
i <- -1.0 * i.
j <- -1.0 * j.
k <- -1.0 * k.
^ self
|
~
^ conjugate self
|
norm
^ ((s * s) + (i * i) + (j * j) + (k * k))
|
inverse
((self norm) = 0.0)
ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
^ nil
].
^ ((self conjugate) / (self norm))
|
+ aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
s <- nc spart + self spart.
i <- nc ipart + self ipart.
j <- nc jpart + self jpart.
k <- nc kpart + self kpart.
^ self
|
- aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
s <- self spart - nc spart.
i <- self ipart - nc ipart.
j <- self jpart - nc jpart.
k <- self kpart - nc kpart.
^ self
|
* aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
s <- (s * nc spart) - (i * nc ipart) - (j * nc jpart) - (k * nc kpart).
i <- (i * nc spart) + (s * nc ipart) + (k * nc jpart) - (j * nc kpart).
j <- (j * nc spart) - (k * nc ipart) + (s * nc jpart) + (i * nc kpart).
k <- (k * nc spart) + (j * nc ipart) - (i * nc jpart) + (s * nc kpart).
^ self
|
/ aNumber ! nc denom r i !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((nc spart == 0.0) & (nc ipart == 0.0))
ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
^ nil
].
self * (nc inverse).
^ self
|
printString
('{', <primitive 78 s>, ', ', <primitive 78 i>, ', ', <primitive 78 j>, ', ', <primitive 78 k>, '}') print.
^ self
|
== aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((s = nc spart) & (i = nc ipart) & (j = nc jpart) & (k = nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
|
< aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
self computeMag.
nc computeMag.
((s < nc spart) & (i < nc ipart) & (j < nc jpart) & (k < nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
|
> aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((s > nc spart) & (i > nc ipart) & (j > nc jpart) & (k > nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
|
<= aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((s <= nc spart) & (i <= nc ipart) & (j <= nc jpart) & (k <= nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
|
>= aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((s >= nc spart) & (i >= nc ipart) & (j >= nc jpart) & (k >= nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
|
~= aNumber ! nc !
(aNumber isKindOf: (self class))
ifFalse: [ nc <- self coerce: aNumber ]
ifTrue: [ nc <- aNumber ].
((s ~= nc spart) ! (i ~= nc ipart) ! (j ~= nc jpart) ! (k ~= nc kpart))
ifTrue: [ ^ true ]
ifFalse: [ ^ false ]
]